#include <iostream>
#include <vector>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void PrintBlock()
{
    sigset_t set, oset;
    sigemptyset(&set);
    sigemptyset(&oset);

    sigprocmask(SIG_BLOCK, &set, &oset);

    std::cout << "Block :" << std::endl;
    for (int signo = 31; signo >= 1; signo--)
    {
        if (sigismember(&set, signo))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

void PrintPending()
{
    sigset_t pending;
    ::sigpending(&pending);

    std::cout << "curr process [ " << getpid() << " ] pending:" << std::endl;
    for (int signo = 31; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << "1";
        }
        else
        {
            std::cout << "0";
        }
    }
    std::cout << std::endl;
}

void Handler(int signo)
{
    static int cont = 0;
    cont++;

    while (true)
    {
        std::cout << "get a signal : " << signo << std::endl;
        std::cout << "###############################" << std::endl;
        PrintBlock();
        // PrintPending();
        std::cout<< "###############################" << std::endl;
        break;
    }
}

int main()
{
    struct sigaction act, old_act;
    act.sa_handler = Handler;

    sigemptyset(&act.sa_mask); // 初始化
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);
    sigaddset(&act.sa_mask, 6);
    sigaddset(&act.sa_mask, 7);

    ::sigaction(2, &act, &old_act);

    while (true)
    {
        // PrintPending();
        PrintBlock();
        pause();
    }

    return 0;
}

// void PrintPending(sigset_t &pending)
// {
//     std::cout << "curr process [ " << getpid() << " ] pending:" << std::endl;
//     for (int signo = 31; signo >= 1; signo--)
//     {
//         if (sigismember(&pending, signo))
//         {
//             std::cout << "1";
//         }
//         else
//         {
//             std::cout << "0";
//         }
//     }
//     std::cout << std::endl;
// }

// void Handler(int signo)
// {
//     std::cout << signo << "号信号被递达" << std::endl;

//     std::cout << "#########################" << std::endl;
//     sigset_t pending;
//     sigpending(&pending);
//     PrintPending(pending);
//     std::cout << "#########################" << std::endl;
// }

// int main()
// {
//     //1.捕捉2号信号
//     signal(2,Handler);//自定义捕捉

//     //2.屏蔽2号信号
//     sigset_t block_set,old_set;
//     sigemptyset(&block_set);//初始化
//     sigemptyset(&old_set);
//     sigaddset(&block_set,SIGINT);//添加2号信号，有没有完成内核中block表的修改？？？

//     //3.向阻塞表中添加2号信号
//     sigprocmask(SIG_BLOCK,&block_set,&old_set);//此处真正的完成对内核block表的修改，屏蔽2号信号

//     //4.获取当前进程的pending表
//     int cnt = 5;
//     while(true)
//     {
//         // //获取当前pending表
//         // sigset_t pending;
//         // sigpending(&pending);

//         //打印pending表
//         //PrintPending(pending);
//         PrintBlock();
//         cnt--;

//         if(cnt == 0)
//         {
//             std::cout << "解除对2号信号的屏蔽!!!" <<std::endl;
//             sigprocmask(SIG_SETMASK,&old_set,&block_set);
//         }
//         sleep(1);
//     }

//     return 0;
// }
